#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import utils

'''
上面第一行注释是为了告诉Linux/OS X系统，这是一个Python可执行程序，Windows系统会忽略这个注释；
第二行注释是为了告诉Python解释器，按照UTF-8编码读取源代码，否则，你在源代码中写的中文输出可能会有乱码.

搞清楚了ASCII、Unicode和UTF-8的关系，我们就可以总结一下现在计算机系统通用的字符编码工作方式：
在计算机内存中，统一使用Unicode编码，当需要保存到硬盘或者需要传输的时候，就转换为UTF-8编码。
用记事本编辑的时候，从文件读取的UTF-8字符被转换为Unicode字符到内存里，编辑完成后，保存的时候再把Unicode转换为UTF-8保存到文件.
--在最新的Python 3版本中，字符串是以Unicode编码的，也就是说，Python的字符串支持多语言
'''

# 对于单个字符的编码，Python提供了ord()函数获取字符的整数表示，chr()函数把编码转换为对应的字符：
print(ord('A'))
print(ord('中'))
print(chr(65))
print(chr(20013))
utils.seperate()

# 如果知道字符的整数编码，还可以用十六进制这么写str
print('\u4e2d\u6587')
utils.seperate()

'''
由于Python的字符串类型是str，在内存中以Unicode表示，一个字符对应若干个字节。
如果要在网络上传输，或者保存到磁盘上，就需要把str变为以字节为单位的bytes。
Python对bytes类型的数据用带b前缀的单引号或双引号表示：
'''
x = b'ABC'  # 要注意区分'ABC'和b'ABC'，前者是str，后者虽然内容显示得和前者一样，但bytes的每个字符都只占用一个字节
print(x)

# 以Unicode表示的str通过encode()方法可以编码为指定的bytes:
print('ABC'.encode('ascii'))
print('ABC'.encode('utf-8'))
print('中文'.encode('utf-8'))  # 在bytes中，无法显示为ASCII字符的字节，用\x##显示
# '中文'.encode('ascii') #含有中文的str无法用ASCII编码，因为中文编码的范围超过了ASCII编码的范围，Python会报错
utils.seperate()

# 反过来，如果我们从网络或磁盘上读取了字节流，那么读到的数据就是bytes。要把bytes变为str，就需要用decode()方法:
print(b'ABC'.decode('ascii'))
print(b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8'))
# print(b'\xe4\xb8\xad\xff'.decode('utf-8')) #如果bytes中包含无法解码的字节，decode()方法会报错
print(b'\xe4\xb8\xad\xff'.decode('utf-8', errors='ignore'))  # 如果bytes中只有一小部分无效的字节，可以传入errors='ignore'忽略错误的字节
utils.seperate()

# 要计算str包含多少个字符，可以用len()函数:
print(len('ABC'))
print(len('中文'))

# len()函数计算的是str的字符数，如果换成bytes，len()函数就计算字节数:
print(len(b'ABC'))
print(len(b'\xe4\xb8\xad\xe6\x96\x87'))
print(len('中文'.encode('utf-8')))
utils.seperate()

# 在Python中，采用的格式化方式和C语言是一致的，用%实现，举例如下：
print('Hello, %s' % 'world')  # 如果只有一个%?，参数括号可以省略
print('Hi, %s, you have $%d.' % ('Michael', 1000000))

# 其中，格式化整数和浮点数还可以指定是否补0和整数与小数的位数：
print('%2d-%02d' % (3, 1))
print('%.2f' % 3.1415926)

# 如果你不太确定应该用什么，%s永远起作用，它会把任何数据类型转换为字符串
print('Age: %s. Gender: %s' % (25, True))
# 字符串里面的%是一个普通字符怎么办？这个时候就需要转义，用%%来表示一个%：
print('growth rate: %d %%' % 7)
